import copy

import allure
import pytest

from extend.keywords import KeyWords
from utils.VarRender import refresh
from parse.CaseParser import case_parser

from core.globalContext import Global_Context


class TestRunner:
    # TODO 1: 读取到对应的数据
    # caseinfo = case_parser("excel", "./data")

    # TODO 2:
    # @pytest.mark.parametrize("caseinfo", caseinfo["case_infos"])
    def test_case_execult(self, caseinfo):
        # print("当前的测试数据：", caseinfo)
        # TODO 2-1: 动态生成一下当前的测试用例标题
        allure.dynamic.title(caseinfo["_case_name"])

        # TODO 2-2: 基于我们步骤一步步进行执行
        try:

            # 获取当前用例变量，方便后续的渲染  第一种
            current_context = caseinfo.get("context", {})
            context = copy.deepcopy(Global_Context().show_dict())
            context.update(current_context)

            # 第二种
            # current_context = caseinfo.get("context", {})
            # Global_Context().set_by_dict(current_context)

            steps = caseinfo.get("steps", None)

            for step in steps:
                step_name = list(step.keys())[0]
                step_value = list(step.values())[0]
                print(f"开始执行步骤：\n{step_name} - {step_value}")

                # TODO : 每一个步骤进行变量的渲染 第一种
                context = copy.deepcopy(Global_Context().show_dict())
                context.update(current_context)
                step_value = refresh(step_value, context)

                # # 第二种
                # context = copy.deepcopy(Global_Context().show_dict())
                # step_value = refresh(step_value, context)

                with allure.step(step_name):

                    # 基于每个步骤的关键字，找到对应的方法，然后把参数给它
                    #  通过【反射】的方式去找到对应的方法
                    key = step_value["关键字"]

                    try:
                        # 具体的方法名, 在 KeyWords 里面找到这个方法
                        key_func = KeyWords().__getattribute__(key)
                    except AttributeError as e:
                        print("没有这个关键字方法", e)

                    # 调用KeyWords方法
                    key_func(**step_value)
        finally:
            print("--当前步骤执行结束--")
